home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 36 / Amiga Format CD36 (1999-01-22)(Future Publishing)(GB)[!][issue 1999-02].iso / -seriously_amiga- / graphics / gfx3d.library / docs / strutturedati.txt < prev   
Text File  |  1998-12-12  |  14KB  |  353 lines

  1.  
  2. -------------------------------------------------------------------------------
  3.  
  4.                                LE STRUTTURE DATI
  5.  
  6. -------------------------------------------------------------------------------
  7.  
  8.  La libreria gfx3d.library necessita, per un corretto funzionamento, delle
  9. seguenti strutture dati:
  10.  
  11.   - Polygon
  12.   - Frame
  13.   - Object
  14.   - ShadeTable
  15.   - Environment
  16.   - Camera
  17.  
  18. Di seguito è presente una dettagliata descrizione di ogni struttura dati
  19.  
  20.  
  21.  
  22.                                ------------------
  23.  
  24.                               LA STRUTTURA POLYGON
  25.  
  26.                                ------------------
  27.  
  28.  
  29.  Il poligono è l'unità base della grafica vettoriale. Ogni oggetto
  30. visualizzabile dalla libreria gfx3d.library è composto di poligoni.
  31. (si veda, a tal proposito, la spiegazione relativa alla struttura dati Frame)
  32. Gli attributi caratterizzanti un poligono sono:
  33.  
  34.   - i vertici;
  35.   - il colore;
  36.   - il tipo di ombreggiatura.
  37.  
  38. Tutti questi attributi vengono assegnati staticamente e non è possibile quindi
  39. modificarli dinamicamente nel corso dell'esecuzione del programma.
  40.  
  41.  Affinchè un poligono sia visualizzabile, i vertici devono descrivere a video
  42. un percorso antiorario (si tenga presente che la libreria segue la regola della
  43. mano destra). Eventuali poligoni aventi entrambe le facce visualizzabili
  44. dovranno essere scomposti in due sottopoligoni.
  45.  Una limitazione corrente della libreria consiste nel fatto che non viene
  46. eseguito alcun clipping tridimensionale a livello di poligoni, per cui, quando
  47. un vertice viene a trovarsi dietro la massima distanza focale della telecamera,
  48. il poligono intero viene scartato dalla graphics pipeline e, di conseguenza,
  49. non viene visualizzato. Per ovviare a tale inconveniente è sufficiente
  50. suddividere poligoni di grandi dimensioni in più poligoni minori.
  51.  Una seconda limitazione consiste nel fatto che la libreria, attualmente,
  52. supporta solo triangoli, per cui eventuali vertici definiti dopo il terzo non
  53. vengono considerati e sono quindi scartati.
  54.  
  55.  Nella versione attuale della libreria, il colore è un numero da 0 a 255
  56. identificante il colore della palette del video. Future versioni supporteranno
  57. possibilmente colori a 12 e 18 bit su Amiga AGA, 15, 16, 24 bit su scheda
  58. grafica.
  59.  
  60.  Nella versione attuale della libreria, il tipo di ombreggiatura può essere uno
  61. tra i seguenti:
  62.  
  63.   - GFX_FILL_SHADING  questo valore specifica che il poligono non viene
  64.                       sfumato;
  65.  
  66.   - GFX_FLAT_SHADING  questo valore specifica che il poligono viene sfumato in
  67.                       rapporto alla sua inclinazione rispetto la direzione di
  68.                       osservazione;
  69.  
  70.   - GFX_DEPTH_CUEING  Questo valore specifica che il poligono viene sfumato in
  71.                       rapporto alla distanza dall'osservatore.
  72.  
  73. E' possibile utilizzare il valore GFX_DEPTH_SHADING in luogo del valore
  74. GFX_DEPTH_CUEING. Per compatibilità con la versione 1.0 della libreria, ad un
  75. poligono, se non specificato precedentemente, viene associato il tipo di
  76. ombreggiatura FILL.
  77.  
  78.  Sono riportati di seguito i passi principali per la definizione di una
  79. struttura Polygon:
  80.  
  81.     GFXBegin( GFX_POLYGON );
  82.         GFXVertex( x0, y0, z0 );
  83.         GFXVertex( x1, y1, z1 );
  84.         GFXVertex( x2, y2, z2 );
  85.         GFXColor( col );
  86.         GFXShading( shade );
  87.     poly = GFXEnd()
  88.  
  89.  
  90.  
  91.                                 ----------------
  92.  
  93.                                LA STRUTTURA FRAME
  94.  
  95.                                 ----------------
  96.  
  97.  
  98.  Un fotogramma rappresenta quello che si deve vedere di un oggetto. Diversi
  99. oggetti possono infatti rappresentare lo stesso tipo di oggetti nel mondo reale
  100. (si pensi, ad esempio, ad una stanza con un tavolo e più sedie...). Utilizzando
  101. la struttura dati Frame, è possibile un notevole risparmio di memoria, in
  102. quanto, in presenza di più oggetti uguali, è sufficiente creare un solo
  103. fotogramma, per poi assegnarlo a tutti gli oggetti in questione.
  104.  
  105.  Gli attributi caratterizzanti un fotogramma sono i singoli poligoni. Come già
  106. detto nella sezione riguardante la struttura dati Polygon, il poligono è
  107. l'unità basilare della grafica vettoriale e, di conseguenza, ogni singolo
  108. fotogramma è composto di un numero variabile di poligoni. Si noti che non è
  109. possibile modificare dinamicamente una struttura Frame, in quanto si tratta di
  110. una struttura ampiamente ottimizzata.
  111.  E' però possibile modificare dinamicamente il fotogramma di un oggetto. Gli
  112. oggetti che supportano questa modalità prendono il nome di "Multi Framed
  113. Objects" (MFO). Questa è infatti la seconda possibilità di utilizzo della
  114. struttura Frame, ovvero l'animazione per fotogrammi. Si consulti a questo
  115. riguardo la spiegazione relativa alla struttura dati Objects.
  116.  
  117.  Sono riportati di seguito i passi principali per la definizione di una
  118. struttura Frame:
  119.  
  120.     GFXBegin( GFX_FRAME );
  121.         GFXPolygon( poly1 );
  122.           ...
  123.         GFXPolygon( polyn );
  124.     frm = GFXEnd()
  125.  
  126. IMPORTANTE:
  127.   Dalla versione 2.4 della GfX3d.library, ogni poligono aggiunto ad un frame
  128.   viene in seguito automaticamente deallocato dalla memoria. In questo modo si
  129.   ottiene, oltre ad una pressochè completa compatibilità software con gli
  130.   ancora pochi programmi che sfruttano questa libreria, anche una discreta
  131.   ottimizzazione nell'utilizzo dello spazio di occupazione in memoria.
  132.  
  133.  
  134.  
  135.                                -----------------
  136.  
  137.                               LA STRUTTURA OBJECT
  138.  
  139.                                -----------------
  140.  
  141.  
  142.  Un oggetto è invece un oggetto 'fisico', in quanto rappresenta un'entità
  143. esistente nella scena da rappresentare.
  144.  
  145.  Di un oggetto si possono specificare le coordinate nell'ambiente, la direzione
  146. che gli assi dell'oggetto formano con quelli dell'ambiente, il fotogramma
  147. appartenente all'oggetto (che cosituisce ciò che si vede dell'oggetto). È
  148. possibile modificare dinamicamente il fotogramma di un oggetto. Gli oggetti che
  149. supportano questa modalità prendono il nome di "Multi Framed Objects" (MFO).
  150.  
  151.  Tutti i precedenti attributi caratterizzanti l'oggetto si possono modificare
  152. dinamicamente tramite l'uso delle funzioni GFXModifyObject...() .
  153.  
  154.  Esistono inoltre i seguenti attributi non modificabili dinamicamente. Tali
  155. attributi specificano i piani di taglio anteriore e posteriore dell'oggetto. se
  156. un oggetto è più vicino (più lontano) del piano di taglio anteriore
  157. (posteriore), allora tale oggetto non viene disegnato a video.
  158.  
  159.  Un'ultima considerazione riguarda la definizione di oggetto MFO. Nella
  160. definizione di tali oggetti è necessario un accorgimento addizionale. È
  161. necessario infatti assegnare all'oggetto MFO in fase di definizione il
  162. fotogramma contenente il massimo numero di vertici e di poligoni, al fine di
  163. poter calcolare il massimo spazio riservato in memoria per l'oggetto stesso.
  164. Naturalmente, una volta definito l'oggetto, è possibile cambiare il fotogramma
  165. in questione tramite la funzione GFXModifyObjectFrame().
  166.  
  167.  Sono riportati di seguito i passi principali per la definizione di una
  168. struttura Object:
  169.  
  170.     GFXBegin( GFX_OBJECT );
  171.         GFXPosition( x, y, z );
  172.         GFXDirection( ax, ay, az );
  173.         GFXFrame( frm );
  174.         GFXNearClip( 0 );
  175.         GFXFarClip( 65536 );
  176.     obj = GFXEnd()
  177.  
  178.  
  179.  
  180.                              ----------------------
  181.  
  182.                             LA STRUTTURA ENVIRONMENT
  183.  
  184.                              ----------------------
  185.  
  186.  
  187.  Un ambiente può essere inteso come un particolare oggetto contenente gli altri
  188. oggetti e la telecamera appartenenti alla scena. Tutte le coordinate e gli
  189. angoli di direzione delle suddette strutture dati fanno infatti riferimento
  190. agli assi di coordinate proprie dell'ambiente.
  191.  
  192.  Sono riportati di seguito i passi principali per la definizione di una
  193. struttura Environment:
  194.  
  195.     GFXBegin( GFX_ENVIRONMENT );
  196.         GFXShadeTable( table );
  197.         GFXObject( obj1 );
  198.         ...
  199.         GFXObject( obj2 );
  200.     env = GFXEnd()
  201.  
  202.  
  203.  
  204.                                -----------------
  205.  
  206.                               LA STRUTTURA CAMERA
  207.  
  208.                                -----------------
  209.  
  210.  
  211.  Mediante la telecamera, l'utente finale 'vede' la scena ed ha la sensazione di
  212. esservi 'immerso'.
  213.  
  214.  La struttura telecamera presenta una molitudine di attributi, atti ad ottenere
  215. una perfetta visuale della scena. Tali attributi sono:
  216.   - la posizione che la telecamera occupa nella scena tridimensionale;
  217.   - la direzione della visuale;
  218.   - la distanza focale per regolare la visione prospettica;
  219.   - i fattori di scala per modificare l'aspetto della scena visualizzata;
  220.   - la larghezza in pixels della visuale;
  221.   - l'altezza in pixels della visuale;
  222.   - il buffer video ove viene disegnata la scena visualizzata;
  223.   - l'ambiente al quale fà riferimento la telecamera;
  224.   - la profondità visiva della telecamera nelle scene in deep cueing.
  225. Molti di tali parametri sono modificabili dinamicamente tramite le funzioni
  226. GFXModifyCamera...() .
  227.  
  228.  Sono riportati di seguito i passi principali per la definizione di una
  229. struttura Camera:
  230.  
  231.     GFXBegin( GFX_CAMERA );
  232.         GFXEnvironment( env );
  233.         GFXPosition( x, y, z );
  234.         GFXDirection( ax, ay, az );
  235.         GFXFocus( focus );
  236.         GFXAspectRatio( rx, ry, rz );
  237.         GFXFarClip( lightdepth );
  238.         GFXWidth( 320 );
  239.         GFXHeight( 200 );
  240.         GFXVideoBuffer( raster );
  241.     obs = GFXEnd()
  242.  
  243.  
  244.  
  245.                              ---------------------
  246.  
  247.                             LA STRUTTURA SHADETABLE
  248.  
  249.                              ---------------------
  250.  
  251.  
  252.  La tabella delle sfumature dei colori viene utilizzata dalla libreria per
  253. calcolare il più velocemente possibile la determinata sfumatura da applicare ad
  254. un colore.
  255.  
  256.  Per costruire questa struttura dati, la libreria necessita del numero di passi
  257. della sfumatura, del colore verso il quale la sfumatura deve tendere, della
  258. profondità massima della sfumatura e di un array contenente tutte le 256
  259. tonalità in uso.
  260.  
  261.  Il colore di destinazione viene specificato tramite la funzione GFXColor(), ed
  262. è importante notare che il colore da passare a tale funzione non rappresenta
  263. l'indice del colore all'interno dei 256 colori utilizzati, bensì rappresenta
  264. una tonalità di colore espressa in 24 bit ( 0RGB ). In questo modo, il colore
  265. di destinazione della sfumatura può anche essere assente dai 256 colori in uso.
  266.  
  267.  La profondità massima raggiungibile della sfumatura indica quale colore
  268. associare ad un poligono oscurato. Supponendo infatti di aver definito la
  269. seguente sfumatura in 16 passi:
  270.           0                                                          15
  271.         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  272.         |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  273.         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  274.           ^                                                           ^
  275.         bianco                                                       nero
  276.           |---------------------------------------------------------->|
  277.  
  278. Senza limite di sfumatura, un poligono pienamente illuminato presenta il colore
  279. bianco, mentre un poligono privo di illuminazione viene disegnato in nero. In
  280. questo modo, però, buona parte dell'ambiente circostante può risultare non
  281. illuminata (si pensi per esempio ad un poligono perpendicolare alla direzione
  282. di vista della telecamera), quindi si avrebbe come risultato una notevole
  283. 'perdita di visibilità', dovuta ai troppi poligoni neri a schermo. Il tutto si
  284. potrebbe migliorare introducendo un minimo di illuminazione ambientale. Questo
  285. si ottiene tramite la limitazione sulla profondità di sfumatura. Introducendo
  286. infatti nell'esempio precedente una profondità massima di 12 passi:
  287.           0                                          11              15
  288.         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  289.         |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  290.         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  291.           ^                                           ^               ^
  292.         bianco                                      grigio           nero
  293.           |------------------------------------------>|
  294.  
  295. si ottiene una sfumatura totale in 12 passi e con colori di destinazione
  296. differenti a seconda della tonalità di ogni colore.
  297.  
  298.  Infine, la libreria deve poter sapere su quali colori operare (ricordiamo
  299. infatti che nel modo a 256 colori non è possibile risalire alla tonalità di
  300. colore visualizzata in assenza di informazioni aggiuntive). Queste informazioni
  301. le vengono passate tramite la funzione GFXPalette(). L'argomento di tale
  302. funzione è un puntatore ad un array di 256 strutture RGB.
  303.  
  304.  Sono riportati di seguito i passi principali per la definizione di una
  305. struttura ShadeTable:
  306.  
  307.     GFXBegin( GFX_SHADETABLE );
  308.         GFX3DSteps( passi );
  309.         GFX3DThreshold( soglia );
  310.         GFX3DColor( 0rgb );
  311.         GFX3DPalette( RGBptr );
  312.     table = GFXEnd()
  313.  
  314. IMPORTANTE:
  315.   Nella versione attuale della libreria (GfX3d.library v2.x), non sempre le sfumature
  316.   vengono calcolate esattamente. Si tratta di un effetto collaterale dovuto a precise
  317.   scelte progettuali, volte a velocizzare la costruzione di una ShadeTable. Future
  318.   versioni della libreria conterranno un'opzione per eseguire il calcolo preciso della
  319.   tabella delle sfumature, anche se a costo di un maggior tempo di esecuzione della
  320.   definizione della tabella stessa.
  321.  
  322.  
  323.  
  324.                                 --------------
  325.  
  326.                                LA STRUTTURA RGB
  327.  
  328.                                 --------------
  329.  
  330.  
  331.  La struttura RGB è l'unica struttura dati liberamente accessibile dall'esterno
  332. della libreria. Essa viene utilizzata per informare la libreria stessa delle
  333. tonalità di colore sulle quali operare.
  334.  
  335.  Gli unici parametri della struttura RGB sono le intensità di colore dei
  336. singoli componenti ( rosso, verde, blu ):
  337.  
  338.   struct gfx3d_RGB
  339.   {
  340.     uchar Red;
  341.     uchar Green;
  342.     uchar Blue;
  343.     char paddle;
  344.   } gfx3d_RGB;
  345.  
  346. L'attributo paddle, per ovvie ragioni di compatibilità con le versioni future
  347. della libreria, deve essere impostato a 0.
  348.  
  349.  
  350.  
  351. -------------------------------------------------------------------------------
  352.  
  353.